package com.lile.stringBuffer;

public class StringBufferDemo {

	public static void main(String[] args) {
		// addMethod();
		// stringDelete();
		// stringReplace();
		// stringReverse();
		// stringCutdown();
		// stringBufferStringConvert();

		int[] arr = { 11, 22, 33, 44, 55 };

		String result = arrayToString(arr);
		System.out.println(result);
	}

	/*
	 * StringBuffer：线程安全的可变字符串。 String的长度固定。
	 * 
	 * 构造方法： StringBuffer()： 构造一个其中不带字符的字符串缓冲区，其初始容量为 16 个字符。 StringBuffer(int
	 * capacity)：构造一个不带字符，但具有指定初始容量的字符串缓冲区。 StringBuffer(String
	 * str):构造一个字符串缓冲区，并将其内容初始化为指定的字符串内容。
	 * 
	 * 成员方法： public int length():返回长度（字符数）实际值 public int capacity():返回当前容量 理论值
	 */
	public static void initMethod() {
		StringBuffer sb = new StringBuffer();
		System.out.println("sb:" + sb);
		System.out.println("sb.length():" + sb.length());
		System.out.println("sb.capacity():" + sb.capacity());
		System.out.println("------------------------------");

		StringBuffer sb2 = new StringBuffer(20);
		System.out.println("sb2:" + sb);
		System.out.println("sb2.length():" + sb2.length());
		System.out.println("sb2.capacity():" + sb2.capacity());
		System.out.println("------------------------------");

		StringBuffer sb3 = new StringBuffer("hello world");
		System.out.println("sb3:" + sb);
		System.out.println("sb3.length():" + sb3.length());
		System.out.println("sb3.capacity():" + sb3.capacity());
		System.out.println("------------------------------");
	}

	/*
	 * 添加功能： public StringBuffer append(String str)：追加数据，往已有数据的后面。 public
	 * StringBuffer insert(int offset,String str):插入数据，往指定位置添加数据。
	 */
	public static void addMethod() {
		StringBuffer sb = new StringBuffer();
		StringBuffer sb2 = sb.append("hello");
		System.out.println(sb == sb2);
		System.out.println("sb:" + sb);
		System.out.println("sb2:" + sb2);

		// 链式编程
		sb.append(" world").append(" java!");

		sb.insert(5, "88");

		System.out.println("sb:" + sb);
	}

	/*
	 * 删除功能： public StringBuffer deleteCharAt(int index)：删除指定位置的字符 public
	 * StringBuffer delete(int start,int end):删除从指定位置开始到指定位置结束的内容
	 */
	public static void stringDelete() {
		StringBuffer sb = new StringBuffer();
		sb.append("hello");
		sb.insert(5, "8");
		sb.append("world");
		sb.append("java");
		System.out.println(sb);

		sb.deleteCharAt(5);
		System.out.println(sb);

		sb.delete(5, sb.length());
		System.out.println(sb);
	}

	/*
	 * public StringBuffer replace(int start,int end,String
	 * str):用给定的字符串替换从指定位置开始到指定位置结束的数据
	 */
	public static void stringReplace() {
		StringBuffer sb = new StringBuffer();
		sb.append("hello").append("world").append("java");
		sb.replace(5, 10, "HA");
		System.out.println("sb:" + sb);
	}

	/*
	 * 反转功能 public StringBuffer reverse()
	 */
	public static void stringReverse() {
		StringBuffer sb = new StringBuffer();
		sb.append("java").append("霞青林爱我");
		sb.reverse();
		System.out.println("sb:" + sb);
	}

	/*
	 * 截取功能:返回值类型是String类型，本身没有发生改变 public String substring(int
	 * start):从指定位置开始到末尾 public String substring(int start,int
	 * end):从指定位置开始到指定位置结束
	 */
	public static void stringCutdown() {
		StringBuffer sb = new StringBuffer();
		sb.append("hello").append("world").append("java");
		String s = sb.substring(5);

		System.out.println("s:" + s);
		System.out.println("sb:" + sb);
	}

	/*
	 * 反转是StringBuffer的特有功能，String没有。
	 * 而String要做反转，稍微麻烦一点。如果能够使用StringBuffer的功能就好了。
	 * 那么，我们到底能不能让一个类去使用另一个类的功能呢?可以。 前提：这两个类之间可以实现相互转换。
	 */
	public static void stringBufferStringConvert() {
		// String -- StringBuffer;
		// StringBuffer sb = "hello";
		// StringBuffer(String str)
		String s = "hello";
		StringBuffer sb = new StringBuffer(s);

		// StringBuffer -- String
		// String(StringBuffer buffer)
		String ss = new String(sb);
	}

	/*
	 * 把数组拼接成一个字符串
	 */
	public static String arrayToString(int[] arr) {
		StringBuffer sb = new StringBuffer();

		sb.append("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				sb.append(arr[x]);
			} else {
				sb.append(arr[x]).append(", ");
			}
		}
		sb.append("]");

		return new String(sb);
	}
}
